package org.example.prompt;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import dev.langchain4j.service.spring.AiService;
import org.example.prompt.model.Employee;
import org.example.prompt.model.LegalPrompt;
import org.example.prompt.model.Person;
import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;

/**
 * AI服务接口，用于处理各种自然语言理解与信息提取任务。
 * 使用LangChain4j框架定义AI服务行为，并通过EXPLICIT模式显式绑定模型和记忆组件。
 * 绑定的聊天模型为"qwenChatModel"，使用的聊天记忆为"chatMemory"。
 */
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel", chatMemory = "chatMemory")
public interface AllPromptService {

    /**
     * 评价类型枚举类，表示用户评价的不同态度分类。
     */
    enum ReviewType {
        POSITIVE, // 好评
        NEGATIVE, // 差评
        MIXED,    // 既有优点又有缺点
        NEUTRAL   // 无明确态度
    }

    /**
     * 从给定文本中提取一个整数。
     *
     * @param text 输入的文本内容
     * @return 提取到的整数值
     */
    @UserMessage("extract a number from {{it}}")
    int extractInt(String text);

    /**
     * 从给定文本中提取一个长整数。
     *
     * @param text 输入的文本内容
     * @return 提取到的长整数值
     */
    @UserMessage("extract a long number from {{it}}")
    Long extractLong(String text);

    /**
     * 从给定文本中提取人员信息。
     *
     * @param text 输入的文本内容
     * @return 包含人员信息的Person对象
     */
    @UserMessage("extract information about a person from {{it}}")
    Person extractPerson(String text);

    /**
     * 判断给定的评价是否为好评。
     *
     * @param review 用户评价内容
     * @return 如果是好评返回true，否则返回false
     */
    @UserMessage("{{it}}是否为好评？")
    boolean isPositiveReview(String review);

    /**
     * 对用户评价进行分类，判断其属于哪种评价类型。
     *
     * @param review 用户评价内容
     * @return 评价类型（如好评、差评等）
     */
    @UserMessage("分析{{it}}的评价类型")
    ReviewType classifyReivew(String review);

    /**
     * 回答与中国法律相关的问题。如果问题不属于中国法律范畴，则返回提示语。
     *
     * @param legalPrompt 法律问题描述对象
     * @return 中国法律相关的回答或拒绝回答的提示语
     */
    @SystemMessage("你是一位专业的中国法律顾问，只回答与中国法律相关的问题，输出限制：其他领域的问题禁止回答，" +
            "直接返回 抱歉，我只能回答中国法律相关问题")
    String answerLegalQuestion(LegalPrompt legalPrompt);



    /**
     * 根据用户提供的描述创建员工信息对象。
     *
     * @param userDescription 用户对员工信息的自然语言描述
     * @return 构建出的Employee对象，包含姓名、年龄、职位、地址及技能等信息
     */
    @UserMessage("""
        请根据用户描述创建一个员工信息。
        用户描述：{{userDescription}}
        
        请返回一个包含以下字段的JSON格式数据：
        - name: 姓名
        - age: 年龄
        - position: 职位
        - address: 地址对象
          - street: 街道
          - city: 城市
          - country: 国家
          - zipCode: 邮编
        - skills: 技能列表
        """)
    Employee createEmployee(@V("userDescription") String userDescription);

}
